]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
keyboard: Allow calling _release() without press on OSK keys with touch
authorCarlos Garnacho <carlosg@gnome.org>
Mon, 22 Mar 2021 17:01:39 +0000 (18:01 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Tue, 27 Apr 2021 19:58:24 +0000 (21:58 +0200)
This is already allowed for pointer events, but touch events still expected
that the touch begin and end happen on the same Key actor. Change this
behavior for touch events, this is necessary for the tap-drag-release
pattern to select key variants to work on all input devices.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1789>

js/ui/keyboard.js

index 10a21cbe07759d2ca07203cf1bfbb78b03e0f824..c6d6fab60afcc373218ed368a8119560b9ba61e0 100644 (file)
@@ -347,7 +347,7 @@ var Key = GObject.registerClass({
                     this.emit('long-press');
 
                     if (this._extendedKeys.length > 0) {
-                        this._touchPressed = false;
+                        this._touchPressSlot = null;
                         this._ensureExtendedKeysPopup();
                         this.keyButton.set_hover(false);
                         this.keyButton.fake_release();
@@ -378,7 +378,7 @@ var Key = GObject.registerClass({
             GLib.source_remove(this._pressTimeoutId);
             this._pressTimeoutId = 0;
         }
-        this._touchPressed = false;
+        this._touchPressSlot = null;
         this.keyButton.set_hover(false);
         this.keyButton.fake_release();
     }
@@ -459,14 +459,19 @@ var Key = GObject.registerClass({
             if (!Meta.is_wayland_compositor())
                 return Clutter.EVENT_PROPAGATE;
 
-            if (!this._touchPressed &&
+            const slot = event.get_event_sequence().get_slot();
+
+            if (!this._touchPressSlot &&
                 event.type() == Clutter.EventType.TOUCH_BEGIN) {
-                this._touchPressed = true;
+                this._touchPressSlot = slot;
                 this._press(key);
-            } else if (this._touchPressed &&
-                       event.type() == Clutter.EventType.TOUCH_END) {
-                this._touchPressed = false;
-                this._release(key);
+            } else if (event.type() === Clutter.EventType.TOUCH_END) {
+                if (!this._touchPressSlot ||
+                    this._touchPressSlot === slot)
+                    this._release(key);
+
+                if (this._touchPressSlot === slot)
+                    this._touchPressSlot = null;
             }
             return Clutter.EVENT_PROPAGATE;
         });